#include "lista.h"
#include <stdlib.h>


extern bool string_comparar(char* s1, char* s2);
extern char* string_copiar(char* s);
extern bool string_iguales(char*s1,  char*s2);
// Completar las funciones en C.

bool esta(lista* l, char*s){
	nodo* act=l->primero;
	bool res=0;
	while(act){
		res=res||string_iguales(s,(char*)(act->datos));
		act=act->sig;
	}
	
	return res;
}

void insertarConOrden(lista* l, char* s){

	nodo** act= &(l->primero);
	if(!esta(l,s)){
	
		while(*act && string_comparar((char*)((*act)->datos),s)!=1){
		act=&((*act)->sig);

		}

		char* s1=string_copiar(s);
        	nodo* new=nodo_crear((void*)s1);

		if(*act==NULL){
			*act=new;
		
		}else{
			nodo* sig=*act;
			*act= new;
			new->sig=sig;
		} 			
	}
	return;
}

lista *generar_equipos(lista* l){

	nodo* act=l->primero;
	lista* l_aux=lista_crear();

	while(act){
		char* pais=(char*)((jugador*)act->datos)->pais;	
		insertarConOrden(l_aux,pais);
		act=act->sig;
	}
				 
	return l_aux;
}

lista *generar_selecciones(lista *li){
	
	lista* l_aux=generar_equipos(li);
	lista* l_res=lista_crear();
	nodo* act=l_aux->primero;
	
	while(act){
		jugador* j=crear_jugador("NA", (char*)(act->datos),'0',0);
		nodo* n=nodo_crear(j);
		lista* l_aux2=filtrar_jugadores(li,(tipo_funcion_cmp)&pais_jugador,n);
		lista* l_aux3=mapear(l_aux2,(tipo_funcion_mapear)&normalizar_jugador);
		lista* l_aux4=ordenar_lista_jugadores(l_aux3);
		double hprom=altura_promedio(l_aux4);	
		seleccion* s=crear_seleccion((char*)act->datos,(double)hprom,l_aux4);
		nodo* n2=nodo_crear(s);
		insertar_ultimo(l_res,n2);
		act=act->sig;	
		//libera la memoria que pedi en el ciclo, que utilice para crear la seleccion
		borrar_jugador(j);
		free(n);
		lista_borrar(l_aux2, (tipo_funcion_borrar)&borrar_jugador);	
		lista_borrar(l_aux3, (tipo_funcion_borrar)&borrar_jugador);
		
	}			

	lista_borrar(l_aux, (tipo_funcion_borrar)&free);		
	return l_res;
}

// Funciones ya implementadas en C 

lista *filtrar_jugadores (lista *l, tipo_funcion_cmp f, nodo *cmp){
	lista *res = lista_crear();
	nodo *n = l->primero;
    while(n != NULL){
		if (f (n->datos, cmp->datos)){
			jugador *j = (jugador *) n->datos;
			nodo *p = nodo_crear ( (void *) crear_jugador (j->nombre, j->pais, j->numero, j->altura) );
			insertar_ultimo (res, p);
		}
		n = n->sig;
	}
	return res;
}

void insertar_ultimo (lista *l, nodo *nuevo){
	nodo *ultimo = l->ultimo;
	if (ultimo == NULL){
		l->primero = nuevo;
	}
	else{
		ultimo->sig = nuevo;
	}
	nuevo->ant = l->ultimo;
	l->ultimo = nuevo;
}

